/*
 * Copyright (C) 2004, Velocityme Partnership
 * RoleActions.java
 *
 * Created on 09 October 2004, 05:39
 */

package com.velocityme.www.interfaces.nodeactions;

import com.velocityme.entity.Role;
import com.velocityme.enums.Permission;
import com.velocityme.session.KeyLocal;
import com.velocityme.session.NodeLocal;
import com.velocityme.session.RoleLocal;
import com.velocityme.www.actionforms.MappedObjectsActionForm;
import com.velocityme.www.actionforms.nodeactionforms.RoleActionForm;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author  Robert
 */
public class RoleActions extends NodeActions {

    /** Creates a new instance of RoleActions */
    public RoleActions() {
    }

    @Override
    public ActionForward show(ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        Long nodeId = (Long)request.getAttribute("nodeId");
        HttpSession session = request.getSession();
        KeyLocal key = (KeyLocal)session.getAttribute("sessionKey");
        Role role = lookupRoleBean().findRole(key, nodeId);
        session.setAttribute("role", role);
        MappedObjectsActionForm permissionMap = new MappedObjectsActionForm();
        for (Permission permission: Permission.values()) {
            permissionMap.setObject(permission.toString(), role.getPermissions().contains(permission));
        }
        session.setAttribute("permissionMap", permissionMap);
        return mapping.findForward("ACTION_DISPLAY");
    }

    @Override
    public ActionForward showCreate(ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response) throws Exception {
        Long nodeId = (Long)request.getAttribute("nodeId");
        HttpSession session = request.getSession();
        KeyLocal key = (KeyLocal)session.getAttribute("sessionKey");
        Role role = new Role();
        role.setParentNode(lookupNodeBean().findNode(key, nodeId));
        session.setAttribute("role", role);
        Permission[] permissions = Permission.sortedValues();
        boolean[] enabled = new boolean[permissions.length];
        session.setAttribute("permissions", permissions);
        RoleActionForm roleAF = new RoleActionForm();
        roleAF.setEnabled(enabled);
        session.setAttribute("roleAF", roleAF);
        return mapping.findForward("ACTION_EDIT");
    }

    @Override
    public ActionForward showEdit(ActionMapping mapping,
                                  ActionForm form,
                                  HttpServletRequest request,
                                  HttpServletResponse response) throws Exception {
        Long nodeId = (Long)request.getAttribute("nodeId");
        HttpSession session = request.getSession();
        KeyLocal key = (KeyLocal)session.getAttribute("sessionKey");
        Role role = lookupRoleBean().findRole(key, nodeId);
        session.setAttribute("role", role);
        Permission[] permissions = Permission.sortedValues();
        boolean[] enabled = new boolean[permissions.length];
        for (int i = 0; i < permissions.length; i++) {
            enabled[i] = role.getPermissions().contains(permissions[i]);
        }
        session.setAttribute("permissions", permissions);
        RoleActionForm roleAF = new RoleActionForm();
        roleAF.setEnabled(enabled);
        session.setAttribute("roleAF", roleAF);
        return mapping.findForward("ACTION_EDIT");
    }

    @Override
    public ActionForward edit(ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession();
        KeyLocal key = (KeyLocal)session.getAttribute("sessionKey");
        Long nodeId;
        if (request.getParameter("btnSubmit").equals("OK")) {
            Role role = (Role)session.getAttribute("role");
            ((RoleActionForm)form).extractRole(key, role);
            if (role.getId() != null) {
                lookupRoleBean().editRole(key, role);
            }
            else {
                role = lookupRoleBean().createRole(key, role);
            }
            nodeId = role.getId();
        }
        // Cancel simply displays the original node again
        else {
            nodeId = ((Long)session.getAttribute("nodeId"));
        }
        request.setAttribute("nodeId", nodeId);
        return mapping.findForward("ACTION_SUCCESS");
    }

    private RoleLocal lookupRoleBean() {
        try {
            Context c = new InitialContext();
            return (RoleLocal) c.lookup("java:comp/env/RoleBean");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private NodeLocal lookupNodeBean() {
        try {
            Context c = new InitialContext();
            return (NodeLocal) c.lookup("java:comp/env/NodeBean");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

}
